#ifndef CLERC_H
#define CLERC_H

#include "Classe.h"
using namespace std;

/**
 * Cette classe implémente le clerc de l'univers AD&D.
 *
 * @todo Définir un alias pour \e toutes les sphères : sans le
 * (min/maj).
 *
 * @author Johan "Solo" Luisier
 */
class Clerc : public Classe
{
 protected:
  static const unsigned nbrCompetences, /**< Nombre de compétences disponibles */
    nbrRestrictions, /**<  Nombre de restritions disponibles */
    ppAlloues; /**< Nombre de pp allouées. */
  static const vector<CompetenceClasse> Comp, /**< Liste de compétences @see CompetenceClasse */
    Restric; /**< Liste de restrictions @see ListCom */
  /**
   * Liste des caractéristiques minimales pour devenir un Clerc.
   */
  static const vector< Prerequis > Limites;
  /**
   * Ensemble des races autorisées pour cette Classe.
   */
  static const set< string > RacesAdmises;
  /**
   * Ensemble de compétences secondaires.
   */
  static const vector< CompetenceClasse > ChgtForme;
  /**
   * Ensemble de compétences secondaires.
   */
  static const vector< CompetenceClasse > CtrlEsprit;
  /**
   * Ensemble de compétences secondaires.
   */
  static const vector< CompetenceClasse > ImmuCharme;
  /**
   * Ensemble de compétences secondaires.
   */
  static const vector< CompetenceClasse > PouvDivins;
  void calculNiveau();
  unsigned calculeTAc0() const;
  void calculNivMag();
 public:
  Clerc(unsigned xp, const vector< unsigned >& trait, unsigned& PP,
	const string& race);
  Clerc( unsigned xp );
  Clerc( const bool& UI );
  Clerc(Classe *ptr);
  ~Clerc();
  void js(unsigned *tab) const;
  void ecrireSorts( const string& nom_fichier, const bool& ecrase,
		    const unsigned& sagesse = -1u ) const;
  void sortsParNiveau(vector< unsigned >& sorts, const unsigned& sagesse) const;
  void prixAcces(map<string, unsigned>*& Map) const;
  bool forceExceptionnelle() const;
  unsigned aSpecialisation() const;
};

#endif
